package main

import (
	"fmt"
)

func modifyArray(x [3]int) {
	x[0] = 100
	fmt.Println(x)
}

func modifyArray2(x [3][2]int) {
	x[2][0] = 100
}

//数组
func main() {
	//存放元素的容器
	//必须指定存放的元素的类型和长度
	//数据的长度是数组类型的一部分
	var a1 [3]bool //[true,false,true]
	var a2 [4]bool //[true,false,true,true]
	fmt.Printf("a1:%T  a2:%T \n", a1, a2)

	//数组的初始化
	//如果不初始化，默认元素都是零值（布尔值：false,整型和浮点型都是0，字符串是""）
	fmt.Println(a1, a2)

	//1.初始化方式1  使用指定的初始值完成初始化
	a1 = [3]bool{true, true, true}
	fmt.Println(a1)
	a100 := [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
	fmt.Println(a100)

	//不足位，补false 零值 空字符串
	a3 := [5]int{1, 3}
	fmt.Printf("a3:%T %v \n", a3, a3)
	a4 := [5]string{"a", "b"}
	fmt.Printf("a4:%T %v \n", a4, a4)

	//2.根据初始值的个数自行推断数组的长度
	a10 := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
	fmt.Printf("%T %v \n", a10, a10)

	//3.定索引值的方式来初始化数组
	a5 := [5]int{0: 2, 4: 3}
	fmt.Printf("a5:%T %v \n", a5, a5)

	//数组遍历,索引从0开始
	citys := [...]string{"北京", "上海", "深圳"}
	fmt.Println(len(citys))
	//1.根据索引遍历
	for i := 0; i <= len(citys)-1; i++ {
		fmt.Println(citys[i])
	}
	//2.for range
	for i, v := range citys {
		fmt.Printf("%d---%s \n", i, v)
	}

	citys1 := [...]byte{'a', 'b', 'c'}
	for i, v := range citys1 {
		fmt.Printf("%d---%c \n", i, v)
	}

	citys2 := [...]rune{'北', '上', '广'}
	for i, v := range citys2 {
		fmt.Printf("%d---%c \n", i, v)
	}

	/* citys3 := [...]byte{'北', '上', '广'}
	for i, v := range citys3 {
		fmt.Printf("%d---%c \n", i, v)
	} */

	//多维数组
	// [1,2]   [3,4]   [5,6]
	var a11 [3][2]int = [3][2]int{
		{1, 2},
		{3, 4},
		{5, 6},
	}
	fmt.Println(a11)

	fmt.Printf("%T\t%v \n", a11, len(a11))
	fmt.Println(a11[1][1])

	//多维数字遍历
	//取出第一层
	for _, v := range a11 {
		fmt.Printf("%d \n", v)
	}

	//取出第二层
	fmt.Println("for range取出：")
	for _, v := range a11 {
		for _, v1 := range v {
			fmt.Printf("%d \t", v1)
		}
		fmt.Println()
	}
	fmt.Println("根据索引值取出：")
	for i := 0; i <= 2; i++ {
		for j := 0; j <= 1; j++ {
			fmt.Printf("%d\t", a11[i][j])
		}
		fmt.Println()
	}

	fmt.Println("根据for range索引值取出：")
	for i, _ := range a11 {
		for j, _ := range a11[i] {
			fmt.Printf("%d\t", a11[i][j])
		}
		fmt.Println()
	}

	/* 	//多维数组只有第一层可以使用...来让编译器推导数组长度
	   	//支持的写法
	   	a12 := [...][2]string{
	   		{"北京", "上海"},
	   		{"广州", "深圳"},
	   		{"成都", "重庆"},
	   	}
	   	fmt.Println(a12)
	   	//不支持多维数组的内层使用...
	   	b12 := [3][...]string{
	   		{"北京", "上海"},
	   		{"广州", "深圳"},
	   		{"成都", "重庆"},
	   	}
	   	fmt.Println(b12) */

	//数组是值类型
	b1 := [3]int{1, 2, 3}
	b2 := b1
	b1[0] = 5
	fmt.Println(b1)
	fmt.Println(b2)

	/* 	1、数组支持 “==“、”!=” 操作符，因为内存总是被初始化过的。
	2、[n]*T表示指针数组，*[n]T表示数组指针 。 */

	//////////////////////////////////////////bug级别的存在/////////////////////////////////
	c := [3]int{10, 20, 30}
	modifyArray(c) //在modify中修改的是a的副本x
	fmt.Println(c) //[10 20 30]
	d := [3][2]int{
		{1, 1},
		{1, 1},
		{1, 1},
	}
	modifyArray2(d) //在modify中修改的是b的副本x
	fmt.Println(d)  //[[1 1] [1 1] [1 1]]
	///////////////////////////////////////////////////////////////////////////////////////

}
